package gui.GLListeners.GLReceptaculos;

import figuras.BSplines;
import figuras.PuntoVector;
import figuras.malla.MallaPorSplineYRevolucion;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.swing.JOptionPane;

import properties.Config;
import transformaciones.TAfin;
import utils.files.FileManagerFlowers;

import componentes.flor.Receptaculo;

public class GLListenerReceptaculoDesign extends GLListenerReceptaculo {

	public GLListenerReceptaculoDesign() {
		super();
	}

	/***************************************************************************
	 * The init method *
	 * ********************************************************** Call by the
	 * GLDrawable just after the Gl-Context is * initialized. * * This method is
	 * used to : * - activate some modes like texture, light ... * - affect
	 * value to properties * - import testures, load your data ... * *
	 **************************************************************************/
	public void init(GLAutoDrawable glDrawable) {
		super.init(glDrawable);

		// para las texturas
		gl.glEnable(GL.GL_TEXTURE_2D);
		camara.esquina();
		//camara.frontal();
		//File file = new File(Consts.DEFAULT_RECEPTACULOS_FILE);
		// File file=new File("resources/receptaculos/prueba");
//		if (file.exists())
//			this.cargaReceptaculo(file);
	}

	public void display(GLAutoDrawable glDrawable) {
		this.glDrawable = glDrawable;
		super.display(glDrawable);

		if (malla == null) {
			gl.glPointSize(3.0f);
			for (int i = 0; i < manejadorSplines.getPuntosIntroducidos().size(); i++) {
				gl.glBegin(GL.GL_POINTS);
				gl.glVertex2d(manejadorSplines.getPuntosIntroducidos().get(i)
						.getX(), manejadorSplines.getPuntosIntroducidos()
						.get(i).getY());
				gl.glEnd();
			}

			for (BSplines b : manejadorSplines.getBsplines())
				b.pintaConLineas(gl);
			// b.pintaConPuntos(gl);
		}
		if (componente != null) {
			if (rota) {
				TAfin matriz = new TAfin(gl);
				matriz.setMatriz(matrix);
				componente.setMatriz(matriz);
			}
			componente.dibuja(glOption);
			// componente.dibuja(GL.GL_POLYGON);
			// componente.dibuja(GL.GL_LINE_LOOP);
		}

		setChanged();
		notifyObservers();
	}

	public void revolucion() {
		// if(manejadorSplines.getBsplines().size()>0){
		try {
			// ArrayList<PuntoVector> puntosControl = manejadorSplines
			// .getBsplines().get(0).getPuntosControl();
			ArrayList<PuntoVector> perfil = this.manejadorSplines.getBsplines()
					.get(0).getPerfil();
			if (perfil.get(0).getY() > perfil.get(perfil.size() - 1).getY()) {
				Config config = Config.getInstance();
				double radianes = config.getDouble("receptaculo.radianes.revolucion");
				int pasos = config.getInteger("receptaculo.pasos.revolucion");
				malla = new MallaPorSplineYRevolucion(manejadorSplines
						.getBsplines().get(0),radianes,pasos,false);
				componente = new Receptaculo(malla, this.manejadorSplines
						.getBsplines(), gl);
				componente.setColor(color);
			} else {
				JOptionPane.showMessageDialog(null,
						"Dibuje el receptaculo de arriba a abajo",
						"Vuelva a dibujar", JOptionPane.INFORMATION_MESSAGE);
				this.limpiaCurvas();
			}

		} catch (java.lang.IndexOutOfBoundsException e) {
			JOptionPane.showMessageDialog(null, "Introduzca una spline",
					"Spline no introducida", JOptionPane.WARNING_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Error",
					"Error creando receptaculo", JOptionPane.ERROR_MESSAGE);
		}

		//camara.esquina();
		camara.frontal();
		ejeXY = true;
	}

	// public void limpiaCurvas() {
	// super.limpiaCurvas();
	// malla = null;
	// //receptaculo=null;
	// componente=null;
	// }

	public void guardaReceptaculo(File file) {
		try {
			if (componente != null) {
				((Receptaculo) componente).guardar(file);
			}
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Archivo no encontrado",
					"Error", JOptionPane.ERROR_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Error al guardar", "Error",
					JOptionPane.ERROR_MESSAGE);
		} catch (java.lang.IndexOutOfBoundsException e) {
			JOptionPane.showMessageDialog(null, "Introduzca una spline",
					"Spline no introducida", JOptionPane.WARNING_MESSAGE);
		} finally {
			ejeXY = true;
		}
	}

	public void cargaReceptaculo(File file) {
		try {
			componente = new Receptaculo(gl, file);
			// receptaculo.cargar(file);
			this.manejadorSplines.setBsplines(componente.getBsplines());
			malla = (MallaPorSplineYRevolucion) componente.getMalla();
			this.color = componente.getColor();
			camara.esquina();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Archivo no encontrado",
					"Error", JOptionPane.ERROR_MESSAGE);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Error al cargar", "Error",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	public void save(String path) {
		super.save(path);
		if (texturePath != null) {
			FileManagerFlowers.copyFile(texturePath, path
					+ texturePath.substring(texturePath.indexOf("."),
							texturePath.length()));
		}
		// ((Receptaculo)componente).save(path);
		guardaReceptaculo(new File(path));
	}

	public void saveToAsciiPLY(String filePath) {
		if (componente != null) {
			componente.saveToAsciiPLY(filePath);
		}
	}

	public void saveToBinaryPLY(String filePath) {
		if (componente != null) {
			componente.saveToBinaryPLY(filePath);
		}
	}

	// public void save(String string){
	// guardaReceptaculo(new File(string));
	// }
}
